mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-05 15:55:57 +03:00
Combine the Expr.pTab and Expr.pWin fields into a union named "y". Add a new
EP_WinFunc property that is only true if Expr.y.pWin is a valid pointer. This reduces the size of the Expr object by 8 bytes, reduces the overall amount of code, and shaves over 1 million cycles off of the speed test. FossilOrigin-Name: ad130bb86e74e6ce165fdbdce3a19699510f0e62071c1c7923b5a4538d888c7c
This commit is contained in:
38
manifest
38
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Fix\sa\scompilation\sissue\sin\sthe\s"userauth"\sextension.\sAlso\sfix\sa\sfew\stest\nscript\serrors\sthat\soccur\swith\sSQLITE_USER_AUTHENTICATION=1\sbuilds.
|
C Combine\sthe\sExpr.pTab\sand\sExpr.pWin\sfields\sinto\sa\sunion\snamed\s"y".\s\sAdd\sa\snew\nEP_WinFunc\sproperty\sthat\sis\sonly\strue\sif\sExpr.y.pWin\sis\sa\svalid\spointer.\nThis\sreduces\sthe\ssize\sof\sthe\sExpr\sobject\sby\s8\sbytes,\sreduces\sthe\soverall\namount\sof\scode,\sand\sshaves\sover\s1\smillion\scycles\soff\sof\sthe\sspeed\stest.
|
||||||
D 2018-09-19T17:09:09.208
|
D 2018-09-20T19:02:15.729
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F Makefile.in 01e95208a78b57d056131382c493c963518f36da4c42b12a97eb324401b3a334
|
F Makefile.in 01e95208a78b57d056131382c493c963518f36da4c42b12a97eb324401b3a334
|
||||||
@@ -436,7 +436,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 2269dd2f37ba963fde4c51e9e83542f126c86a8e10357c17f48137c6bee5299b
|
F src/alter.c e561794b3175930f25b0177e4a1c42f6696f200d261519913b3615d9ae97516d
|
||||||
F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9
|
F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9
|
||||||
F src/attach.c 4bd5b92633671d3e8ce431153ebb1893b50335818423b5373f3f27969f79769a
|
F src/attach.c 4bd5b92633671d3e8ce431153ebb1893b50335818423b5373f3f27969f79769a
|
||||||
F src/auth.c 32a5bbe3b755169ab6c66311c5225a3cd4f75a46c041f7fb117e0cbb68055114
|
F src/auth.c 32a5bbe3b755169ab6c66311c5225a3cd4f75a46c041f7fb117e0cbb68055114
|
||||||
@@ -454,9 +454,9 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957
|
|||||||
F src/dbpage.c 4aa7f26198934dbd002e69418220eae3dbc71b010bbac32bd78faf86b52ce6c3
|
F src/dbpage.c 4aa7f26198934dbd002e69418220eae3dbc71b010bbac32bd78faf86b52ce6c3
|
||||||
F src/dbstat.c edabb82611143727511a45ca0859b8cd037851ebe756ae3db289859dd18b6f91
|
F src/dbstat.c edabb82611143727511a45ca0859b8cd037851ebe756ae3db289859dd18b6f91
|
||||||
F src/delete.c 107e28d3ef8bd72fd11953374ca9107cd74e8b09c3ded076a6048742d26ce7d2
|
F src/delete.c 107e28d3ef8bd72fd11953374ca9107cd74e8b09c3ded076a6048742d26ce7d2
|
||||||
F src/expr.c 92dc4e104b06d06ffeacbd1a4dc0a520daf37f6156278fb6ece5e90e2ca6b610
|
F src/expr.c 610eea078f240e8d55e81666a65b05a42e52008d24059c59093dd18b3d15b565
|
||||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||||
F src/fkey.c f59253c0be4b1e9dfcb073b6d6d6ab83090ae50c08b5c113b76013c4b157cd6a
|
F src/fkey.c 972a4ba14296bef2303a0abbad1e3d82bc3c61f9e6ce4e8e9528bdee68748812
|
||||||
F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f
|
F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f
|
||||||
F src/global.c 9bf034fd560bdd514715170ed8460bb7f823cec113f0569ef3f18a20c7ccd128
|
F src/global.c 9bf034fd560bdd514715170ed8460bb7f823cec113f0569ef3f18a20c7ccd128
|
||||||
F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a
|
F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a
|
||||||
@@ -491,7 +491,7 @@ F src/os_win.c 070cdbb400097c6cda54aa005356095afdc2f3ee691d17192c54724ef146a971
|
|||||||
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
||||||
F src/pager.c a0d8f686ef64549ad5b356fd30429bd9ee7a06dd42b4d6faa096352ff26b1c5b
|
F src/pager.c a0d8f686ef64549ad5b356fd30429bd9ee7a06dd42b4d6faa096352ff26b1c5b
|
||||||
F src/pager.h ecc554a55bc55d1c4ba5e17137b72e238e00bd81e72ff2662d8b9c8c10ae3963
|
F src/pager.h ecc554a55bc55d1c4ba5e17137b72e238e00bd81e72ff2662d8b9c8c10ae3963
|
||||||
F src/parse.y 4118dbf9c37c410e5c4775c033b1aaf67ac8ff7965df7a4bb429dd5db2dbe374
|
F src/parse.y 6840fe7c0b5eb4dd25ee5d075213bc8255ed4c0678d71bfb6744d0520d91c179
|
||||||
F src/pcache.c 135ef0bc6fb2e3b7178d49ab5c9176254c8a691832c1bceb1156b2fbdd0869bd
|
F src/pcache.c 135ef0bc6fb2e3b7178d49ab5c9176254c8a691832c1bceb1156b2fbdd0869bd
|
||||||
F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170
|
F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170
|
||||||
F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880
|
F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880
|
||||||
@@ -500,14 +500,14 @@ F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324
|
|||||||
F src/prepare.c f8e260d940a0e08494c0f30744521b2f832d7263eca9d02b050cea0ba144b097
|
F src/prepare.c f8e260d940a0e08494c0f30744521b2f832d7263eca9d02b050cea0ba144b097
|
||||||
F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381
|
F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381
|
||||||
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
||||||
F src/resolve.c 352c6af1a99441206ff62a6f7429dbf537827f42c428639695220b9c8639e33b
|
F src/resolve.c 3f99bbea840d917acd530c75a180d00415fc6e06d1b693c32fd9a4fe91023a91
|
||||||
F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
|
F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
|
||||||
F src/select.c 8afcc2b56a6ef76717bb59b6109cd3de0f6fae2803894d6f806640c0aa24dfac
|
F src/select.c 1b7ade8fabb85ccd3369683a7951fda37b2843aa1e4ef1fa866b09596a8bfec3
|
||||||
F src/shell.c.in 6e0aad854be738a5d0368940459399be211e9ac43aebe92bb9ed46cfe38d0e1f
|
F src/shell.c.in 6e0aad854be738a5d0368940459399be211e9ac43aebe92bb9ed46cfe38d0e1f
|
||||||
F src/sqlite.h.in 4b4c2f2daeeed4412ba9d81bc78092c69831fe6eda4f0ae5bf951da51a8dccec
|
F src/sqlite.h.in 4b4c2f2daeeed4412ba9d81bc78092c69831fe6eda4f0ae5bf951da51a8dccec
|
||||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||||
F src/sqlite3ext.h 305adca1b5da4a33ce2db5bd236935768e951d5651bfe5560ed55cfcdbce6a63
|
F src/sqlite3ext.h 305adca1b5da4a33ce2db5bd236935768e951d5651bfe5560ed55cfcdbce6a63
|
||||||
F src/sqliteInt.h 83ee9b55db521b70294b2858872e69b96d0a4810d8221796def3e99cca5ee663
|
F src/sqliteInt.h 214e56845ff775d1b53529d3d9488afa12d190d4b5ae56abd0a04ecfcf5f9097
|
||||||
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
||||||
F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
|
F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
|
||||||
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
||||||
@@ -566,7 +566,7 @@ 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 9f55961518f77793edd56eee860ecf035d4370ebbb0726ad2f6cada6637fd16b
|
F src/tokenize.c 9f55961518f77793edd56eee860ecf035d4370ebbb0726ad2f6cada6637fd16b
|
||||||
F src/treeview.c e7a7f90552bb418533cdd0309b5eb71d4effa50165b880fc8c2001e613577e5f
|
F src/treeview.c 0ef7dc77d6fe03172ba65dddfd3b3c557b7b7e217ca1963b7665beb266a0e2c0
|
||||||
F src/trigger.c d3d78568f37fb2e6cdcc2d1e7b60156f15b0b600adec55b83c5d42f6cad250bd
|
F src/trigger.c d3d78568f37fb2e6cdcc2d1e7b60156f15b0b600adec55b83c5d42f6cad250bd
|
||||||
F src/update.c 682f112c49247d2fe5950c9fe2226046c6bc497cf114f74d58766926914216ff
|
F src/update.c 682f112c49247d2fe5950c9fe2226046c6bc497cf114f74d58766926914216ff
|
||||||
F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4
|
F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4
|
||||||
@@ -582,16 +582,16 @@ F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c9419
|
|||||||
F src/vdbemem.c 81329ab760e4ec0162119d9cd10193e0303c45c5935bb20c7ae9139d44dd6641
|
F src/vdbemem.c 81329ab760e4ec0162119d9cd10193e0303c45c5935bb20c7ae9139d44dd6641
|
||||||
F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f
|
F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f
|
||||||
F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392
|
F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392
|
||||||
F src/vtab.c 8665561f244c137a2d17b5c3e5910d7303054fe841c5d510e53f23beb0089594
|
F src/vtab.c 9ada8a26ffc17c27ab27a06b23599faeb2e0c487ad9ef53903917ac973b42170
|
||||||
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
|
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
|
||||||
F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f
|
F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f
|
||||||
F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a
|
F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a
|
||||||
F src/walker.c ba7225773931760cf60bf22f34d0cce2588df7ce5ce0f215a52eb88234b55ac4
|
F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66
|
||||||
F src/where.c 2019126801437944c38cc62a99491e98591460b7cc07ab57eb66165f710a289b
|
F src/where.c 2019126801437944c38cc62a99491e98591460b7cc07ab57eb66165f710a289b
|
||||||
F src/whereInt.h b90ef9b9707ef750eab2a7a080c48fb4900315033274689def32d0cf5a81ebe4
|
F src/whereInt.h b90ef9b9707ef750eab2a7a080c48fb4900315033274689def32d0cf5a81ebe4
|
||||||
F src/wherecode.c 4f88f5b39ad4aeb5bdd47a546d74149bb902ef49ca9f02a45b2a5bd2dd70b6bd
|
F src/wherecode.c 3df0a541373d5f999684d761e4bd700d57adb46c7d39da4e77b767b5adcd5893
|
||||||
F src/whereexpr.c eb462ebe085f6cbb6bdda797a041fbd7e3724586203344043d1088a2117d8e44
|
F src/whereexpr.c 1b5a5a7876997f65232bbf19c5c1eeb47eb328b8fa5b28c865543052904cde00
|
||||||
F src/window.c 4b503da928dace3e845b891381a4d98eeb8c5744313ae3643df8d8d21fdcca65
|
F src/window.c a28d8d42c51c7e31136a42f3e245282049d4a9466b36d7bd765772991472df41
|
||||||
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
||||||
F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
|
F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
|
||||||
F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
|
F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
|
||||||
@@ -1767,7 +1767,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P 2034fa8089676132b5e2f71bdebf1af9ca141da2e173920c6e84fb974ab0f022
|
P 221f3f572ed49d7af69a2e7c88741fa5206ea33ca59ee791eac7698bdd11ca4d
|
||||||
R b045d000830b7f892b6bae2ce9b528b3
|
R a205fb07eb91b652f9b260657ba75a88
|
||||||
U dan
|
U drh
|
||||||
Z e635b6ecc9802f0bfb5422b4720e432b
|
Z 462af2fea172a873521f037816957a1f
|
||||||
|
@@ -1 +1 @@
|
|||||||
221f3f572ed49d7af69a2e7c88741fa5206ea33ca59ee791eac7698bdd11ca4d
|
ad130bb86e74e6ce165fdbdce3a19699510f0e62071c1c7923b5a4538d888c7c
|
@@ -803,7 +803,7 @@ static int renameColumnExprCb(Walker *pWalker, Expr *pExpr){
|
|||||||
renameTokenFind(pWalker->pParse, p, (void*)pExpr);
|
renameTokenFind(pWalker->pParse, p, (void*)pExpr);
|
||||||
}else if( pExpr->op==TK_COLUMN
|
}else if( pExpr->op==TK_COLUMN
|
||||||
&& pExpr->iColumn==p->iCol
|
&& pExpr->iColumn==p->iCol
|
||||||
&& p->pTab==pExpr->pTab
|
&& p->pTab==pExpr->y.pTab
|
||||||
){
|
){
|
||||||
renameTokenFind(pWalker->pParse, p, (void*)pExpr);
|
renameTokenFind(pWalker->pParse, p, (void*)pExpr);
|
||||||
}
|
}
|
||||||
@@ -1341,8 +1341,8 @@ renameColumnFunc_done:
|
|||||||
*/
|
*/
|
||||||
static int renameTableExprCb(Walker *pWalker, Expr *pExpr){
|
static int renameTableExprCb(Walker *pWalker, Expr *pExpr){
|
||||||
RenameCtx *p = pWalker->u.pRename;
|
RenameCtx *p = pWalker->u.pRename;
|
||||||
if( pExpr->op==TK_COLUMN && p->pTab==pExpr->pTab ){
|
if( pExpr->op==TK_COLUMN && p->pTab==pExpr->y.pTab ){
|
||||||
renameTokenFind(pWalker->pParse, p, (void*)&pExpr->pTab);
|
renameTokenFind(pWalker->pParse, p, (void*)&pExpr->y.pTab);
|
||||||
}
|
}
|
||||||
return WRC_Continue;
|
return WRC_Continue;
|
||||||
}
|
}
|
||||||
|
79
src/expr.c
79
src/expr.c
@@ -58,8 +58,8 @@ char sqlite3ExprAffinity(Expr *pExpr){
|
|||||||
return sqlite3AffinityType(pExpr->u.zToken, 0);
|
return sqlite3AffinityType(pExpr->u.zToken, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if( (op==TK_AGG_COLUMN || op==TK_COLUMN) && pExpr->pTab ){
|
if( (op==TK_AGG_COLUMN || op==TK_COLUMN) && pExpr->y.pTab ){
|
||||||
return sqlite3TableColumnAffinity(pExpr->pTab, pExpr->iColumn);
|
return sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn);
|
||||||
}
|
}
|
||||||
if( op==TK_SELECT_COLUMN ){
|
if( op==TK_SELECT_COLUMN ){
|
||||||
assert( pExpr->pLeft->flags&EP_xIsSelect );
|
assert( pExpr->pLeft->flags&EP_xIsSelect );
|
||||||
@@ -143,13 +143,13 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){
|
|||||||
if( p->flags & EP_Generic ) break;
|
if( p->flags & EP_Generic ) break;
|
||||||
if( (op==TK_AGG_COLUMN || op==TK_COLUMN
|
if( (op==TK_AGG_COLUMN || op==TK_COLUMN
|
||||||
|| op==TK_REGISTER || op==TK_TRIGGER)
|
|| op==TK_REGISTER || op==TK_TRIGGER)
|
||||||
&& p->pTab!=0
|
&& p->y.pTab!=0
|
||||||
){
|
){
|
||||||
/* op==TK_REGISTER && p->pTab!=0 happens when pExpr was originally
|
/* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally
|
||||||
** a TK_COLUMN but was previously evaluated and cached in a register */
|
** a TK_COLUMN but was previously evaluated and cached in a register */
|
||||||
int j = p->iColumn;
|
int j = p->iColumn;
|
||||||
if( j>=0 ){
|
if( j>=0 ){
|
||||||
const char *zColl = p->pTab->aCol[j].zColl;
|
const char *zColl = p->y.pTab->aCol[j].zColl;
|
||||||
pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0);
|
pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1052,6 +1052,10 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){
|
|||||||
assert( p!=0 );
|
assert( p!=0 );
|
||||||
/* Sanity check: Assert that the IntValue is non-negative if it exists */
|
/* Sanity check: Assert that the IntValue is non-negative if it exists */
|
||||||
assert( !ExprHasProperty(p, EP_IntValue) || p->u.iValue>=0 );
|
assert( !ExprHasProperty(p, EP_IntValue) || p->u.iValue>=0 );
|
||||||
|
|
||||||
|
assert( !ExprHasProperty(p, EP_WinFunc) || p->y.pWin!=0 || db->mallocFailed );
|
||||||
|
assert( p->op!=TK_FUNCTION || ExprHasProperty(p, EP_TokenOnly|EP_Reduced)
|
||||||
|
|| p->y.pWin==0 || ExprHasProperty(p, EP_WinFunc) );
|
||||||
#ifdef SQLITE_DEBUG
|
#ifdef SQLITE_DEBUG
|
||||||
if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){
|
if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){
|
||||||
assert( p->pLeft==0 );
|
assert( p->pLeft==0 );
|
||||||
@@ -1070,8 +1074,9 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){
|
|||||||
}else{
|
}else{
|
||||||
sqlite3ExprListDelete(db, p->x.pList);
|
sqlite3ExprListDelete(db, p->x.pList);
|
||||||
}
|
}
|
||||||
if( !ExprHasProperty(p, EP_Reduced) ){
|
if( ExprHasProperty(p, EP_WinFunc) ){
|
||||||
sqlite3WindowDelete(db, p->pWin);
|
assert( p->op==TK_FUNCTION );
|
||||||
|
sqlite3WindowDelete(db, p->y.pWin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken);
|
if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken);
|
||||||
@@ -1135,7 +1140,7 @@ static int dupedExprStructSize(Expr *p, int flags){
|
|||||||
assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 );
|
assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 );
|
||||||
if( 0==flags || p->op==TK_SELECT_COLUMN
|
if( 0==flags || p->op==TK_SELECT_COLUMN
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
|| p->pWin
|
|| ExprHasProperty(p, EP_WinFunc)
|
||||||
#endif
|
#endif
|
||||||
){
|
){
|
||||||
nSize = EXPR_FULLSIZE;
|
nSize = EXPR_FULLSIZE;
|
||||||
@@ -1278,10 +1283,9 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){
|
|||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
if( ExprHasProperty(p, EP_Reduced|EP_TokenOnly) ){
|
if( ExprHasProperty(p, EP_WinFunc) ){
|
||||||
pNew->pWin = 0;
|
pNew->y.pWin = sqlite3WindowDup(db, pNew, p->y.pWin);
|
||||||
}else{
|
assert( ExprHasProperty(pNew, EP_WinFunc) );
|
||||||
pNew->pWin = sqlite3WindowDup(db, pNew, p->pWin);
|
|
||||||
}
|
}
|
||||||
#endif /* SQLITE_OMIT_WINDOWFUNC */
|
#endif /* SQLITE_OMIT_WINDOWFUNC */
|
||||||
if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){
|
if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){
|
||||||
@@ -2089,8 +2093,8 @@ int sqlite3ExprCanBeNull(const Expr *p){
|
|||||||
return 0;
|
return 0;
|
||||||
case TK_COLUMN:
|
case TK_COLUMN:
|
||||||
return ExprHasProperty(p, EP_CanBeNull) ||
|
return ExprHasProperty(p, EP_CanBeNull) ||
|
||||||
p->pTab==0 || /* Reference to column of index on expression */
|
p->y.pTab==0 || /* Reference to column of index on expression */
|
||||||
(p->iColumn>=0 && p->pTab->aCol[p->iColumn].notNull==0);
|
(p->iColumn>=0 && p->y.pTab->aCol[p->iColumn].notNull==0);
|
||||||
default:
|
default:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -3378,7 +3382,7 @@ expr_code_doover:
|
|||||||
** constant.
|
** constant.
|
||||||
*/
|
*/
|
||||||
int iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target);
|
int iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target);
|
||||||
int aff = sqlite3TableColumnAffinity(pExpr->pTab, pExpr->iColumn);
|
int aff = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn);
|
||||||
if( aff!=SQLITE_AFF_BLOB ){
|
if( aff!=SQLITE_AFF_BLOB ){
|
||||||
static const char zAff[] = "B\000C\000D\000E";
|
static const char zAff[] = "B\000C\000D\000E";
|
||||||
assert( SQLITE_AFF_BLOB=='A' );
|
assert( SQLITE_AFF_BLOB=='A' );
|
||||||
@@ -3402,7 +3406,7 @@ expr_code_doover:
|
|||||||
iTab = pParse->iSelfTab - 1;
|
iTab = pParse->iSelfTab - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return sqlite3ExprCodeGetColumn(pParse, pExpr->pTab,
|
return sqlite3ExprCodeGetColumn(pParse, pExpr->y.pTab,
|
||||||
pExpr->iColumn, iTab, target,
|
pExpr->iColumn, iTab, target,
|
||||||
pExpr->op2);
|
pExpr->op2);
|
||||||
}
|
}
|
||||||
@@ -3616,8 +3620,8 @@ expr_code_doover:
|
|||||||
CollSeq *pColl = 0; /* A collating sequence */
|
CollSeq *pColl = 0; /* A collating sequence */
|
||||||
|
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
if( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) && pExpr->pWin ){
|
if( ExprHasProperty(pExpr, EP_WinFunc) ){
|
||||||
return pExpr->pWin->regResult;
|
return pExpr->y.pWin->regResult;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -3860,7 +3864,7 @@ expr_code_doover:
|
|||||||
** p1==1 -> old.a p1==4 -> new.a
|
** p1==1 -> old.a p1==4 -> new.a
|
||||||
** p1==2 -> old.b p1==5 -> new.b
|
** p1==2 -> old.b p1==5 -> new.b
|
||||||
*/
|
*/
|
||||||
Table *pTab = pExpr->pTab;
|
Table *pTab = pExpr->y.pTab;
|
||||||
int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + pExpr->iColumn;
|
int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + pExpr->iColumn;
|
||||||
|
|
||||||
assert( pExpr->iTable==0 || pExpr->iTable==1 );
|
assert( pExpr->iTable==0 || pExpr->iTable==1 );
|
||||||
@@ -3871,7 +3875,7 @@ expr_code_doover:
|
|||||||
sqlite3VdbeAddOp2(v, OP_Param, p1, target);
|
sqlite3VdbeAddOp2(v, OP_Param, p1, target);
|
||||||
VdbeComment((v, "r[%d]=%s.%s", target,
|
VdbeComment((v, "r[%d]=%s.%s", target,
|
||||||
(pExpr->iTable ? "new" : "old"),
|
(pExpr->iTable ? "new" : "old"),
|
||||||
(pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName)
|
(pExpr->iColumn<0 ? "rowid" : pExpr->y.pTab->aCol[pExpr->iColumn].zName)
|
||||||
));
|
));
|
||||||
|
|
||||||
#ifndef SQLITE_OMIT_FLOATING_POINT
|
#ifndef SQLITE_OMIT_FLOATING_POINT
|
||||||
@@ -4722,6 +4726,20 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){
|
|||||||
if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){
|
if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){
|
||||||
if( pA->op==TK_FUNCTION ){
|
if( pA->op==TK_FUNCTION ){
|
||||||
if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2;
|
if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2;
|
||||||
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
|
/* Justification for the assert():
|
||||||
|
** window functions have p->op==TK_FUNCTION but aggregate functions
|
||||||
|
** have p->op==TK_AGG_FUNCTION. So any comparison between an aggregate
|
||||||
|
** function and a window function should have failed before reaching
|
||||||
|
** this point. And, it is not possible to have a window function and
|
||||||
|
** a scalar function with the same name and number of arguments. So
|
||||||
|
** if we reach this point, either A and B both window functions or
|
||||||
|
** neither are a window functions. */
|
||||||
|
assert( ExprHasProperty(pA,EP_WinFunc)==ExprHasProperty(pB,EP_WinFunc) );
|
||||||
|
if( ExprHasProperty(pA,EP_WinFunc) ){
|
||||||
|
if( sqlite3WindowCompare(pParse,pA->y.pWin,pB->y.pWin)!=0 ) return 2;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}else if( pA->op==TK_COLLATE ){
|
}else if( pA->op==TK_COLLATE ){
|
||||||
if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2;
|
if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2;
|
||||||
}else if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){
|
}else if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){
|
||||||
@@ -4741,21 +4759,6 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){
|
|||||||
if( pA->iTable!=pB->iTable
|
if( pA->iTable!=pB->iTable
|
||||||
&& (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2;
|
&& (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2;
|
||||||
}
|
}
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
|
||||||
/* Justification for the assert():
|
|
||||||
** window functions have p->op==TK_FUNCTION but aggregate functions
|
|
||||||
** have p->op==TK_AGG_FUNCTION. So any comparison between an aggregate
|
|
||||||
** function and a window function should have failed before reaching
|
|
||||||
** this point. And, it is not possible to have a window function and
|
|
||||||
** a scalar function with the same name and number of arguments. So
|
|
||||||
** if we reach this point, either A and B both window functions or
|
|
||||||
** neither are a window functions. */
|
|
||||||
assert( (pA->pWin==0)==(pB->pWin==0) );
|
|
||||||
|
|
||||||
if( pA->pWin!=0 ){
|
|
||||||
if( sqlite3WindowCompare(pParse,pA->pWin,pB->pWin)!=0 ) return 2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -4899,8 +4902,8 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){
|
|||||||
testcase( pExpr->op==TK_LE );
|
testcase( pExpr->op==TK_LE );
|
||||||
testcase( pExpr->op==TK_GT );
|
testcase( pExpr->op==TK_GT );
|
||||||
testcase( pExpr->op==TK_GE );
|
testcase( pExpr->op==TK_GE );
|
||||||
if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->pTab))
|
if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->y.pTab))
|
||||||
|| (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->pTab))
|
|| (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->y.pTab))
|
||||||
){
|
){
|
||||||
return WRC_Prune;
|
return WRC_Prune;
|
||||||
}
|
}
|
||||||
@@ -5131,7 +5134,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
|
|||||||
&& (k = addAggInfoColumn(pParse->db, pAggInfo))>=0
|
&& (k = addAggInfoColumn(pParse->db, pAggInfo))>=0
|
||||||
){
|
){
|
||||||
pCol = &pAggInfo->aCol[k];
|
pCol = &pAggInfo->aCol[k];
|
||||||
pCol->pTab = pExpr->pTab;
|
pCol->pTab = pExpr->y.pTab;
|
||||||
pCol->iTable = pExpr->iTable;
|
pCol->iTable = pExpr->iTable;
|
||||||
pCol->iColumn = pExpr->iColumn;
|
pCol->iColumn = pExpr->iColumn;
|
||||||
pCol->iMem = ++pParse->nMem;
|
pCol->iMem = ++pParse->nMem;
|
||||||
|
@@ -502,7 +502,7 @@ static Expr *exprTableColumn(
|
|||||||
){
|
){
|
||||||
Expr *pExpr = sqlite3Expr(db, TK_COLUMN, 0);
|
Expr *pExpr = sqlite3Expr(db, TK_COLUMN, 0);
|
||||||
if( pExpr ){
|
if( pExpr ){
|
||||||
pExpr->pTab = pTab;
|
pExpr->y.pTab = pTab;
|
||||||
pExpr->iTable = iCursor;
|
pExpr->iTable = iCursor;
|
||||||
pExpr->iColumn = iCol;
|
pExpr->iColumn = iCol;
|
||||||
}
|
}
|
||||||
|
@@ -941,13 +941,10 @@ idlist(A) ::= nm(Y).
|
|||||||
p->pLeft = p->pRight = 0;
|
p->pLeft = p->pRight = 0;
|
||||||
p->x.pList = 0;
|
p->x.pList = 0;
|
||||||
p->pAggInfo = 0;
|
p->pAggInfo = 0;
|
||||||
p->pTab = 0;
|
p->y.pTab = 0;
|
||||||
p->op2 = 0;
|
p->op2 = 0;
|
||||||
p->iTable = 0;
|
p->iTable = 0;
|
||||||
p->iColumn = 0;
|
p->iColumn = 0;
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
|
||||||
p->pWin = 0;
|
|
||||||
#endif
|
|
||||||
p->u.zToken = (char*)&p[1];
|
p->u.zToken = (char*)&p[1];
|
||||||
memcpy(p->u.zToken, t.z, t.n);
|
memcpy(p->u.zToken, t.z, t.n);
|
||||||
p->u.zToken[t.n] = 0;
|
p->u.zToken[t.n] = 0;
|
||||||
|
@@ -159,7 +159,7 @@ int sqlite3MatchSpanName(
|
|||||||
** (even if X is implied).
|
** (even if X is implied).
|
||||||
** pExpr->iTable Set to the cursor number for the table obtained
|
** pExpr->iTable Set to the cursor number for the table obtained
|
||||||
** from pSrcList.
|
** from pSrcList.
|
||||||
** pExpr->pTab Points to the Table structure of X.Y (even if
|
** pExpr->y.pTab Points to the Table structure of X.Y (even if
|
||||||
** X and/or Y are implied.)
|
** X and/or Y are implied.)
|
||||||
** pExpr->iColumn Set to the column number within the table.
|
** pExpr->iColumn Set to the column number within the table.
|
||||||
** pExpr->op Set to TK_COLUMN.
|
** pExpr->op Set to TK_COLUMN.
|
||||||
@@ -203,7 +203,6 @@ static int lookupName(
|
|||||||
|
|
||||||
/* Initialize the node to no-match */
|
/* Initialize the node to no-match */
|
||||||
pExpr->iTable = -1;
|
pExpr->iTable = -1;
|
||||||
pExpr->pTab = 0;
|
|
||||||
ExprSetVVAProperty(pExpr, EP_NoReduce);
|
ExprSetVVAProperty(pExpr, EP_NoReduce);
|
||||||
|
|
||||||
/* Translate the schema name in zDb into a pointer to the corresponding
|
/* Translate the schema name in zDb into a pointer to the corresponding
|
||||||
@@ -265,7 +264,7 @@ static int lookupName(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if( IN_RENAME_OBJECT && pItem->zAlias ){
|
if( IN_RENAME_OBJECT && pItem->zAlias ){
|
||||||
sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->pTab);
|
sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( 0==(cntTab++) ){
|
if( 0==(cntTab++) ){
|
||||||
@@ -291,13 +290,13 @@ static int lookupName(
|
|||||||
}
|
}
|
||||||
if( pMatch ){
|
if( pMatch ){
|
||||||
pExpr->iTable = pMatch->iCursor;
|
pExpr->iTable = pMatch->iCursor;
|
||||||
pExpr->pTab = pMatch->pTab;
|
pExpr->y.pTab = pMatch->pTab;
|
||||||
/* RIGHT JOIN not (yet) supported */
|
/* RIGHT JOIN not (yet) supported */
|
||||||
assert( (pMatch->fg.jointype & JT_RIGHT)==0 );
|
assert( (pMatch->fg.jointype & JT_RIGHT)==0 );
|
||||||
if( (pMatch->fg.jointype & JT_LEFT)!=0 ){
|
if( (pMatch->fg.jointype & JT_LEFT)!=0 ){
|
||||||
ExprSetProperty(pExpr, EP_CanBeNull);
|
ExprSetProperty(pExpr, EP_CanBeNull);
|
||||||
}
|
}
|
||||||
pSchema = pExpr->pTab->pSchema;
|
pSchema = pExpr->y.pTab->pSchema;
|
||||||
}
|
}
|
||||||
} /* if( pSrcList ) */
|
} /* if( pSrcList ) */
|
||||||
|
|
||||||
@@ -354,7 +353,7 @@ static int lookupName(
|
|||||||
testcase( iCol==(-1) );
|
testcase( iCol==(-1) );
|
||||||
if( IN_RENAME_OBJECT ){
|
if( IN_RENAME_OBJECT ){
|
||||||
pExpr->iColumn = iCol;
|
pExpr->iColumn = iCol;
|
||||||
pExpr->pTab = pTab;
|
pExpr->y.pTab = pTab;
|
||||||
eNewExprOp = TK_COLUMN;
|
eNewExprOp = TK_COLUMN;
|
||||||
}else{
|
}else{
|
||||||
pExpr->iTable = pNC->uNC.pUpsert->regData + iCol;
|
pExpr->iTable = pNC->uNC.pUpsert->regData + iCol;
|
||||||
@@ -376,7 +375,7 @@ static int lookupName(
|
|||||||
testcase( iCol==32 );
|
testcase( iCol==32 );
|
||||||
pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol));
|
pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol));
|
||||||
}
|
}
|
||||||
pExpr->pTab = pTab;
|
pExpr->y.pTab = pTab;
|
||||||
pExpr->iColumn = (i16)iCol;
|
pExpr->iColumn = (i16)iCol;
|
||||||
eNewExprOp = TK_TRIGGER;
|
eNewExprOp = TK_TRIGGER;
|
||||||
#endif /* SQLITE_OMIT_TRIGGER */
|
#endif /* SQLITE_OMIT_TRIGGER */
|
||||||
@@ -476,7 +475,7 @@ static int lookupName(
|
|||||||
assert( pExpr->op==TK_ID );
|
assert( pExpr->op==TK_ID );
|
||||||
if( ExprHasProperty(pExpr,EP_DblQuoted) ){
|
if( ExprHasProperty(pExpr,EP_DblQuoted) ){
|
||||||
pExpr->op = TK_STRING;
|
pExpr->op = TK_STRING;
|
||||||
pExpr->pTab = 0;
|
pExpr->y.pTab = 0;
|
||||||
return WRC_Prune;
|
return WRC_Prune;
|
||||||
}
|
}
|
||||||
if( sqlite3ExprIdToTrueFalse(pExpr) ){
|
if( sqlite3ExprIdToTrueFalse(pExpr) ){
|
||||||
@@ -554,9 +553,9 @@ Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSrc, int iCol){
|
|||||||
Expr *p = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0);
|
Expr *p = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0);
|
||||||
if( p ){
|
if( p ){
|
||||||
struct SrcList_item *pItem = &pSrc->a[iSrc];
|
struct SrcList_item *pItem = &pSrc->a[iSrc];
|
||||||
p->pTab = pItem->pTab;
|
p->y.pTab = pItem->pTab;
|
||||||
p->iTable = pItem->iCursor;
|
p->iTable = pItem->iCursor;
|
||||||
if( p->pTab->iPKey==iCol ){
|
if( p->y.pTab->iPKey==iCol ){
|
||||||
p->iColumn = -1;
|
p->iColumn = -1;
|
||||||
}else{
|
}else{
|
||||||
p->iColumn = (ynVar)iCol;
|
p->iColumn = (ynVar)iCol;
|
||||||
@@ -646,7 +645,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
|||||||
pItem = pSrcList->a;
|
pItem = pSrcList->a;
|
||||||
assert( HasRowid(pItem->pTab) && pItem->pTab->pSelect==0 );
|
assert( HasRowid(pItem->pTab) && pItem->pTab->pSelect==0 );
|
||||||
pExpr->op = TK_COLUMN;
|
pExpr->op = TK_COLUMN;
|
||||||
pExpr->pTab = pItem->pTab;
|
pExpr->y.pTab = pItem->pTab;
|
||||||
pExpr->iTable = pItem->iCursor;
|
pExpr->iTable = pItem->iCursor;
|
||||||
pExpr->iColumn = -1;
|
pExpr->iColumn = -1;
|
||||||
pExpr->affinity = SQLITE_AFF_INTEGER;
|
pExpr->affinity = SQLITE_AFF_INTEGER;
|
||||||
@@ -692,7 +691,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
|||||||
sqlite3RenameTokenRemap(pParse, (void*)pExpr, (void*)pRight);
|
sqlite3RenameTokenRemap(pParse, (void*)pExpr, (void*)pRight);
|
||||||
}
|
}
|
||||||
if( IN_RENAME_OBJECT ){
|
if( IN_RENAME_OBJECT ){
|
||||||
sqlite3RenameTokenRemap(pParse, (void*)&pExpr->pTab, (void*)pLeft);
|
sqlite3RenameTokenRemap(pParse, (void*)&pExpr->y.pTab, (void*)pLeft);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr);
|
return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr);
|
||||||
@@ -782,18 +781,18 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
|||||||
|| (pDef->xValue==0 && pDef->xInverse==0)
|
|| (pDef->xValue==0 && pDef->xInverse==0)
|
||||||
|| (pDef->xValue && pDef->xInverse && pDef->xSFunc && pDef->xFinalize)
|
|| (pDef->xValue && pDef->xInverse && pDef->xSFunc && pDef->xFinalize)
|
||||||
);
|
);
|
||||||
if( pDef && pDef->xValue==0 && pExpr->pWin ){
|
if( pDef && pDef->xValue==0 && ExprHasProperty(pExpr, EP_WinFunc) ){
|
||||||
sqlite3ErrorMsg(pParse,
|
sqlite3ErrorMsg(pParse,
|
||||||
"%.*s() may not be used as a window function", nId, zId
|
"%.*s() may not be used as a window function", nId, zId
|
||||||
);
|
);
|
||||||
pNC->nErr++;
|
pNC->nErr++;
|
||||||
}else if(
|
}else if(
|
||||||
(is_agg && (pNC->ncFlags & NC_AllowAgg)==0)
|
(is_agg && (pNC->ncFlags & NC_AllowAgg)==0)
|
||||||
|| (is_agg && (pDef->funcFlags & SQLITE_FUNC_WINDOW) && !pExpr->pWin)
|
|| (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !pExpr->y.pWin)
|
||||||
|| (is_agg && pExpr->pWin && (pNC->ncFlags & NC_AllowWin)==0)
|
|| (is_agg && pExpr->y.pWin && (pNC->ncFlags & NC_AllowWin)==0)
|
||||||
){
|
){
|
||||||
const char *zType;
|
const char *zType;
|
||||||
if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pExpr->pWin ){
|
if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pExpr->y.pWin ){
|
||||||
zType = "window";
|
zType = "window";
|
||||||
}else{
|
}else{
|
||||||
zType = "aggregate";
|
zType = "aggregate";
|
||||||
@@ -823,7 +822,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
|||||||
}
|
}
|
||||||
if( is_agg ){
|
if( is_agg ){
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
pNC->ncFlags &= ~(pExpr->pWin ? NC_AllowWin : NC_AllowAgg);
|
pNC->ncFlags &= ~(pExpr->y.pWin ? NC_AllowWin : NC_AllowAgg);
|
||||||
#else
|
#else
|
||||||
pNC->ncFlags &= ~NC_AllowAgg;
|
pNC->ncFlags &= ~NC_AllowAgg;
|
||||||
#endif
|
#endif
|
||||||
@@ -832,17 +831,17 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
|||||||
sqlite3WalkExprList(pWalker, pList);
|
sqlite3WalkExprList(pWalker, pList);
|
||||||
if( is_agg ){
|
if( is_agg ){
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
if( pExpr->pWin ){
|
if( pExpr->y.pWin ){
|
||||||
Select *pSel = pNC->pWinSelect;
|
Select *pSel = pNC->pWinSelect;
|
||||||
sqlite3WalkExprList(pWalker, pExpr->pWin->pPartition);
|
sqlite3WalkExprList(pWalker, pExpr->y.pWin->pPartition);
|
||||||
sqlite3WalkExprList(pWalker, pExpr->pWin->pOrderBy);
|
sqlite3WalkExprList(pWalker, pExpr->y.pWin->pOrderBy);
|
||||||
sqlite3WalkExpr(pWalker, pExpr->pWin->pFilter);
|
sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter);
|
||||||
sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->pWin, pDef);
|
sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.pWin, pDef);
|
||||||
if( 0==pSel->pWin
|
if( 0==pSel->pWin
|
||||||
|| 0==sqlite3WindowCompare(pParse, pSel->pWin, pExpr->pWin)
|
|| 0==sqlite3WindowCompare(pParse, pSel->pWin, pExpr->y.pWin)
|
||||||
){
|
){
|
||||||
pExpr->pWin->pNextWin = pSel->pWin;
|
pExpr->y.pWin->pNextWin = pSel->pWin;
|
||||||
pSel->pWin = pExpr->pWin;
|
pSel->pWin = pExpr->y.pWin;
|
||||||
}
|
}
|
||||||
pNC->ncFlags |= NC_AllowWin;
|
pNC->ncFlags |= NC_AllowWin;
|
||||||
}else
|
}else
|
||||||
@@ -1265,13 +1264,13 @@ static int resolveOrderGroupBy(
|
|||||||
for(j=0; j<pSelect->pEList->nExpr; j++){
|
for(j=0; j<pSelect->pEList->nExpr; j++){
|
||||||
if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){
|
if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
if( pE->pWin ){
|
if( ExprHasProperty(pE, EP_WinFunc) ){
|
||||||
/* Since this window function is being changed into a reference
|
/* Since this window function is being changed into a reference
|
||||||
** to the same window function the result set, remove the instance
|
** to the same window function the result set, remove the instance
|
||||||
** of this window function from the Select.pWin list. */
|
** of this window function from the Select.pWin list. */
|
||||||
Window **pp;
|
Window **pp;
|
||||||
for(pp=&pSelect->pWin; *pp; pp=&(*pp)->pNextWin){
|
for(pp=&pSelect->pWin; *pp; pp=&(*pp)->pNextWin){
|
||||||
if( *pp==pE->pWin ){
|
if( *pp==pE->y.pWin ){
|
||||||
*pp = (*pp)->pNextWin;
|
*pp = (*pp)->pNextWin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
14
src/select.c
14
src/select.c
@@ -803,7 +803,7 @@ static void selectExprDefer(
|
|||||||
struct ExprList_item *pItem = &pEList->a[i];
|
struct ExprList_item *pItem = &pEList->a[i];
|
||||||
if( pItem->u.x.iOrderByCol==0 ){
|
if( pItem->u.x.iOrderByCol==0 ){
|
||||||
Expr *pExpr = pItem->pExpr;
|
Expr *pExpr = pItem->pExpr;
|
||||||
Table *pTab = pExpr->pTab;
|
Table *pTab = pExpr->y.pTab;
|
||||||
if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 && pTab && !IsVirtual(pTab)
|
if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 && pTab && !IsVirtual(pTab)
|
||||||
&& (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF)
|
&& (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF)
|
||||||
){
|
){
|
||||||
@@ -826,12 +826,12 @@ static void selectExprDefer(
|
|||||||
Expr *pNew = sqlite3PExpr(pParse, TK_COLUMN, 0, 0);
|
Expr *pNew = sqlite3PExpr(pParse, TK_COLUMN, 0, 0);
|
||||||
if( pNew ){
|
if( pNew ){
|
||||||
pNew->iTable = pExpr->iTable;
|
pNew->iTable = pExpr->iTable;
|
||||||
pNew->pTab = pExpr->pTab;
|
pNew->y.pTab = pExpr->y.pTab;
|
||||||
pNew->iColumn = pPk ? pPk->aiColumn[k] : -1;
|
pNew->iColumn = pPk ? pPk->aiColumn[k] : -1;
|
||||||
pExtra = sqlite3ExprListAppend(pParse, pExtra, pNew);
|
pExtra = sqlite3ExprListAppend(pParse, pExtra, pNew);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pSort->aDefer[nDefer].pTab = pExpr->pTab;
|
pSort->aDefer[nDefer].pTab = pExpr->y.pTab;
|
||||||
pSort->aDefer[nDefer].iCsr = pExpr->iTable;
|
pSort->aDefer[nDefer].iCsr = pExpr->iTable;
|
||||||
pSort->aDefer[nDefer].nKey = nKey;
|
pSort->aDefer[nDefer].nKey = nKey;
|
||||||
nDefer++;
|
nDefer++;
|
||||||
@@ -1680,7 +1680,7 @@ static const char *columnTypeImpl(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert( pTab && pExpr->pTab==pTab );
|
assert( pTab && pExpr->y.pTab==pTab );
|
||||||
if( pS ){
|
if( pS ){
|
||||||
/* The "table" is actually a sub-select or a view in the FROM clause
|
/* The "table" is actually a sub-select or a view in the FROM clause
|
||||||
** of the SELECT statement. Return the declaration type and origin
|
** of the SELECT statement. Return the declaration type and origin
|
||||||
@@ -1865,7 +1865,7 @@ static void generateColumnNames(
|
|||||||
|
|
||||||
assert( p!=0 );
|
assert( p!=0 );
|
||||||
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 || p->pTab!=0 ); /* Covering idx not yet coded */
|
assert( p->op!=TK_COLUMN || p->y.pTab!=0 ); /* Covering idx not yet coded */
|
||||||
if( pEList->a[i].zName ){
|
if( pEList->a[i].zName ){
|
||||||
/* An AS clause always takes first priority */
|
/* An AS clause always takes first priority */
|
||||||
char *zName = pEList->a[i].zName;
|
char *zName = pEList->a[i].zName;
|
||||||
@@ -1873,7 +1873,7 @@ static void generateColumnNames(
|
|||||||
}else if( srcName && p->op==TK_COLUMN ){
|
}else if( srcName && p->op==TK_COLUMN ){
|
||||||
char *zCol;
|
char *zCol;
|
||||||
int iCol = p->iColumn;
|
int iCol = p->iColumn;
|
||||||
pTab = p->pTab;
|
pTab = p->y.pTab;
|
||||||
assert( pTab!=0 );
|
assert( pTab!=0 );
|
||||||
if( iCol<0 ) iCol = pTab->iPKey;
|
if( iCol<0 ) iCol = pTab->iPKey;
|
||||||
assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) );
|
assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) );
|
||||||
@@ -1964,7 +1964,7 @@ int sqlite3ColumnsFromExprList(
|
|||||||
if( pColExpr->op==TK_COLUMN ){
|
if( pColExpr->op==TK_COLUMN ){
|
||||||
/* For columns use the column name name */
|
/* For columns use the column name name */
|
||||||
int iCol = pColExpr->iColumn;
|
int iCol = pColExpr->iColumn;
|
||||||
Table *pTab = pColExpr->pTab;
|
Table *pTab = pColExpr->y.pTab;
|
||||||
assert( pTab!=0 );
|
assert( pTab!=0 );
|
||||||
if( iCol<0 ) iCol = pTab->iPKey;
|
if( iCol<0 ) iCol = pTab->iPKey;
|
||||||
zName = iCol>=0 ? pTab->aCol[iCol].zName : "rowid";
|
zName = iCol>=0 ? pTab->aCol[iCol].zName : "rowid";
|
||||||
|
@@ -2459,11 +2459,11 @@ struct Expr {
|
|||||||
** TK_COLUMN: the value of p5 for OP_Column
|
** TK_COLUMN: the value of p5 for OP_Column
|
||||||
** TK_AGG_FUNCTION: nesting depth */
|
** TK_AGG_FUNCTION: nesting depth */
|
||||||
AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */
|
AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */
|
||||||
Table *pTab; /* Table for TK_COLUMN expressions. Can be NULL
|
union {
|
||||||
** for a column of an index on an expression */
|
Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
** for a column of an index on an expression */
|
||||||
Window *pWin; /* Window definition for window functions */
|
Window *pWin; /* TK_FUNCTION: Window definition for the func */
|
||||||
#endif
|
} y;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2493,6 +2493,7 @@ struct Expr {
|
|||||||
#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */
|
#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */
|
||||||
#define EP_Alias 0x400000 /* Is an alias for a result set column */
|
#define EP_Alias 0x400000 /* Is an alias for a result set column */
|
||||||
#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */
|
#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */
|
||||||
|
#define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** The EP_Propagate mask is a set of properties that automatically propagate
|
** The EP_Propagate mask is a set of properties that automatically propagate
|
||||||
|
@@ -497,7 +497,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){
|
|||||||
}else{
|
}else{
|
||||||
pFarg = pExpr->x.pList;
|
pFarg = pExpr->x.pList;
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
pWin = pExpr->pWin;
|
pWin = pExpr->y.pWin;
|
||||||
#else
|
#else
|
||||||
pWin = 0;
|
pWin = 0;
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1053,7 +1053,7 @@ FuncDef *sqlite3VtabOverloadFunction(
|
|||||||
/* Check to see the left operand is a column in a virtual table */
|
/* Check to see the left operand is a column in a virtual table */
|
||||||
if( NEVER(pExpr==0) ) return pDef;
|
if( NEVER(pExpr==0) ) return pDef;
|
||||||
if( pExpr->op!=TK_COLUMN ) return pDef;
|
if( pExpr->op!=TK_COLUMN ) return pDef;
|
||||||
pTab = pExpr->pTab;
|
pTab = pExpr->y.pTab;
|
||||||
if( pTab==0 ) return pDef;
|
if( pTab==0 ) return pDef;
|
||||||
if( !IsVirtual(pTab) ) return pDef;
|
if( !IsVirtual(pTab) ) return pDef;
|
||||||
pVtab = sqlite3GetVTable(db, pTab)->pVtab;
|
pVtab = sqlite3GetVTable(db, pTab)->pVtab;
|
||||||
|
@@ -55,8 +55,8 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){
|
|||||||
if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort;
|
if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort;
|
||||||
}
|
}
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
if( !ExprHasProperty(pExpr, EP_Reduced) && pExpr->pWin ){
|
if( ExprHasProperty(pExpr, EP_WinFunc) ){
|
||||||
Window *pWin = pExpr->pWin;
|
Window *pWin = pExpr->y.pWin;
|
||||||
if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort;
|
if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort;
|
||||||
if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort;
|
if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort;
|
||||||
if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort;
|
if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort;
|
||||||
|
@@ -1117,7 +1117,7 @@ static int whereIndexExprTransNode(Walker *p, Expr *pExpr){
|
|||||||
pExpr->op = TK_COLUMN;
|
pExpr->op = TK_COLUMN;
|
||||||
pExpr->iTable = pX->iIdxCur;
|
pExpr->iTable = pX->iIdxCur;
|
||||||
pExpr->iColumn = pX->iIdxCol;
|
pExpr->iColumn = pX->iIdxCol;
|
||||||
pExpr->pTab = 0;
|
pExpr->y.pTab = 0;
|
||||||
return WRC_Prune;
|
return WRC_Prune;
|
||||||
}else{
|
}else{
|
||||||
return WRC_Continue;
|
return WRC_Continue;
|
||||||
|
@@ -281,7 +281,7 @@ static int isLikeOrGlob(
|
|||||||
){
|
){
|
||||||
if( pLeft->op!=TK_COLUMN
|
if( pLeft->op!=TK_COLUMN
|
||||||
|| sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT
|
|| sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT
|
||||||
|| IsVirtual(pLeft->pTab) /* Value might be numeric */
|
|| IsVirtual(pLeft->y.pTab) /* Value might be numeric */
|
||||||
){
|
){
|
||||||
sqlite3ExprDelete(db, pPrefix);
|
sqlite3ExprDelete(db, pPrefix);
|
||||||
sqlite3ValueFree(pVal);
|
sqlite3ValueFree(pVal);
|
||||||
@@ -382,7 +382,7 @@ static int isAuxiliaryVtabOperator(
|
|||||||
** MATCH(expression,vtab_column)
|
** MATCH(expression,vtab_column)
|
||||||
*/
|
*/
|
||||||
pCol = pList->a[1].pExpr;
|
pCol = pList->a[1].pExpr;
|
||||||
if( pCol->op==TK_COLUMN && IsVirtual(pCol->pTab) ){
|
if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){
|
||||||
for(i=0; i<ArraySize(aOp); i++){
|
for(i=0; i<ArraySize(aOp); i++){
|
||||||
if( sqlite3StrICmp(pExpr->u.zToken, aOp[i].zOp)==0 ){
|
if( sqlite3StrICmp(pExpr->u.zToken, aOp[i].zOp)==0 ){
|
||||||
*peOp2 = aOp[i].eOp2;
|
*peOp2 = aOp[i].eOp2;
|
||||||
@@ -404,12 +404,12 @@ static int isAuxiliaryVtabOperator(
|
|||||||
** with function names in an arbitrary case.
|
** with function names in an arbitrary case.
|
||||||
*/
|
*/
|
||||||
pCol = pList->a[0].pExpr;
|
pCol = pList->a[0].pExpr;
|
||||||
if( pCol->op==TK_COLUMN && IsVirtual(pCol->pTab) ){
|
if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){
|
||||||
sqlite3_vtab *pVtab;
|
sqlite3_vtab *pVtab;
|
||||||
sqlite3_module *pMod;
|
sqlite3_module *pMod;
|
||||||
void (*xNotUsed)(sqlite3_context*,int,sqlite3_value**);
|
void (*xNotUsed)(sqlite3_context*,int,sqlite3_value**);
|
||||||
void *pNotUsed;
|
void *pNotUsed;
|
||||||
pVtab = sqlite3GetVTable(db, pCol->pTab)->pVtab;
|
pVtab = sqlite3GetVTable(db, pCol->y.pTab)->pVtab;
|
||||||
assert( pVtab!=0 );
|
assert( pVtab!=0 );
|
||||||
assert( pVtab->pModule!=0 );
|
assert( pVtab->pModule!=0 );
|
||||||
pMod = (sqlite3_module *)pVtab->pModule;
|
pMod = (sqlite3_module *)pVtab->pModule;
|
||||||
@@ -427,10 +427,10 @@ static int isAuxiliaryVtabOperator(
|
|||||||
int res = 0;
|
int res = 0;
|
||||||
Expr *pLeft = pExpr->pLeft;
|
Expr *pLeft = pExpr->pLeft;
|
||||||
Expr *pRight = pExpr->pRight;
|
Expr *pRight = pExpr->pRight;
|
||||||
if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->pTab) ){
|
if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->y.pTab) ){
|
||||||
res++;
|
res++;
|
||||||
}
|
}
|
||||||
if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->pTab) ){
|
if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->y.pTab) ){
|
||||||
res++;
|
res++;
|
||||||
SWAP(Expr*, pLeft, pRight);
|
SWAP(Expr*, pLeft, pRight);
|
||||||
}
|
}
|
||||||
@@ -1583,7 +1583,7 @@ void sqlite3WhereTabFuncArgs(
|
|||||||
if( pColRef==0 ) return;
|
if( pColRef==0 ) return;
|
||||||
pColRef->iTable = pItem->iCursor;
|
pColRef->iTable = pItem->iCursor;
|
||||||
pColRef->iColumn = k++;
|
pColRef->iColumn = k++;
|
||||||
pColRef->pTab = pTab;
|
pColRef->y.pTab = pTab;
|
||||||
pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef,
|
pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef,
|
||||||
sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0));
|
sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0));
|
||||||
whereClauseInsert(pWC, pTerm, TERM_DYNAMIC);
|
whereClauseInsert(pWC, pTerm, TERM_DYNAMIC);
|
||||||
|
10
src/window.c
10
src/window.c
@@ -624,12 +624,12 @@ static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){
|
|||||||
switch( pExpr->op ){
|
switch( pExpr->op ){
|
||||||
|
|
||||||
case TK_FUNCTION:
|
case TK_FUNCTION:
|
||||||
if( pExpr->pWin==0 ){
|
if( !ExprHasProperty(pExpr, EP_WinFunc) ){
|
||||||
break;
|
break;
|
||||||
}else{
|
}else{
|
||||||
Window *pWin;
|
Window *pWin;
|
||||||
for(pWin=p->pWin; pWin; pWin=pWin->pNextWin){
|
for(pWin=p->pWin; pWin; pWin=pWin->pNextWin){
|
||||||
if( pExpr->pWin==pWin ){
|
if( pExpr->y.pWin==pWin ){
|
||||||
assert( pWin->pOwner==pExpr );
|
assert( pWin->pOwner==pExpr );
|
||||||
return WRC_Prune;
|
return WRC_Prune;
|
||||||
}
|
}
|
||||||
@@ -959,11 +959,13 @@ windowAllocErr:
|
|||||||
*/
|
*/
|
||||||
void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){
|
void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){
|
||||||
if( p ){
|
if( p ){
|
||||||
|
assert( p->op==TK_FUNCTION );
|
||||||
/* This routine is only called for the parser. If pWin was not
|
/* This routine is only called for the parser. If pWin was not
|
||||||
** allocated due to an OOM, then the parser would fail before ever
|
** allocated due to an OOM, then the parser would fail before ever
|
||||||
** invoking this routine */
|
** invoking this routine */
|
||||||
if( ALWAYS(pWin) ){
|
if( ALWAYS(pWin) ){
|
||||||
p->pWin = pWin;
|
p->y.pWin = pWin;
|
||||||
|
ExprSetProperty(p, EP_WinFunc);
|
||||||
pWin->pOwner = p;
|
pWin->pOwner = p;
|
||||||
if( p->flags & EP_Distinct ){
|
if( p->flags & EP_Distinct ){
|
||||||
sqlite3ErrorMsg(pParse,
|
sqlite3ErrorMsg(pParse,
|
||||||
@@ -2126,7 +2128,7 @@ static void windowCodeDefaultStep(
|
|||||||
*/
|
*/
|
||||||
Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){
|
Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){
|
||||||
Window *pNew = 0;
|
Window *pNew = 0;
|
||||||
if( p ){
|
if( ALWAYS(p) ){
|
||||||
pNew = sqlite3DbMallocZero(db, sizeof(Window));
|
pNew = sqlite3DbMallocZero(db, sizeof(Window));
|
||||||
if( pNew ){
|
if( pNew ){
|
||||||
pNew->zName = sqlite3DbStrDup(db, p->zName);
|
pNew->zName = sqlite3DbStrDup(db, p->zName);
|
||||||
|
Reference in New Issue
Block a user