From: drh <> Date: Thu, 9 Nov 2023 12:17:57 +0000 (+0000) Subject: Do not replace expressions that return subtypes with values taken from an X-Git-Tag: version-3.45.0~183^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b18bb822dc4ae9ee1c44c6d8267ffc4a3fd3fcf4;p=thirdparty%2Fsqlite.git Do not replace expressions that return subtypes with values taken from an index. FossilOrigin-Name: a35d13db09e32ee339f3983fe36b073714753ee3d39f577ae8d20596d7adc3eb --- b18bb822dc4ae9ee1c44c6d8267ffc4a3fd3fcf4 diff --cc manifest index f9b734176e,6996862b81..50b7a2513d --- a/manifest +++ b/manifest @@@ -1,5 -1,5 +1,5 @@@ - C Omit\sthe\snew\sSQLITE_VALUE_SUBTYPE\sname.\s\sStay\swith\slegacy\sSQLTIE_SUBTYPE.\nAdd\sextra\sdocumentation\sto\ssqlite3_value_subtype()\sand\ssqlite3_result_subtype()\nindicating\sthat\sthe\sSQLITE_SUBTYPE\sand\sSQLITE_RESULT_SUBTYPE\sproperties\sare\nrequired\son\sfunctions\sthat\suse\sthose\sinterfaces. - D 2023-11-09T12:08:16.633 -C Do\snot\scover\sexpressions\susing\san\sindexed\sexpression\sif\sthe\sindexed\sexpression\nis\sa\sfunction\sthat\smight\sset\sa\ssubtype. -D 2023-11-08T18:08:07.513 ++C Do\snot\sreplace\sexpressions\sthat\sreturn\ssubtypes\swith\svalues\staken\sfrom\san\nindex. ++D 2023-11-09T12:17:57.430 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@@ -726,10 -726,10 +726,10 @@@ F src/resolve.c d017bad7ba8e778617701a0 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c a19daa26e95f7245106a31f288b2f50c72d1f2cc156703f04c8c91450e111515 F src/shell.c.in 7312c571ebf518fc8927bbb5aeb4fa67e5b0dfb2adae4258dcd1ccae42c11e1f -F src/sqlite.h.in a0fce680a40fe81b13eae3749d001134d9fe0a43aecc09a8986520d5119acfcd +F src/sqlite.h.in 8da45c84e79cde72c73fcb4260addcc7c00fac3bc6f5594b81a3792c1b196264 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 - F src/sqliteInt.h fe1bc1d3ee5302bb8e6b7284cd900bed2d4dd402d08d2893c055afe7297249a8 -F src/sqliteInt.h 90bbf1ba8f47753c84f15cdb0e5dc6267d3f391cc66b9fbd6f441881d1bf44a1 ++F src/sqliteInt.h cd171cba32c7a553e7623fbd82b68b36a1b6c81079ab963260777ea9b3abe4d9 F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6 F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@@ -809,7 -809,7 +809,7 @@@ F src/vxworks.h d2988f4e5a61a4dfe82c652 F src/wal.c bba7db5dae3ffe2c6b9c173fc10be4b570b125e985cb5b95a6c22716213adde4 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c 7c7ea0115345851c3da4e04e2e239a29983b61fb5b038b94eede6aba462640e2 - F src/where.c 313ce81270d2a414672370e1ee74e65949ad620519193d4cac2986d073cbc8a0 -F src/where.c 431309d7920383671b05d43454351230eb9c01d963a6f7d4a516334cbbcce1d4 ++F src/where.c 8718d58065745a4b7203a6b5d7c77b00d67eaf31a66d37c54a00f47c0cd23ac5 F src/whereInt.h 4b38c5889514e3aead3f27d0ee9a26e47c3f150efc59e2a8b4e3bc8835e4d7a1 F src/wherecode.c 5d77db30a2a3dd532492ae882de114edba2fae672622056b1c7fd61f5917a8f1 F src/whereexpr.c dc5096eca5ed503999be3bdee8a90c51361289a678d396a220912e9cb73b3c00 @@@ -2139,8 -2139,11 +2139,9 @@@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a9 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 - P 48a92e3ad855227188a4c5afe4abbb7171761cf6fc930660084d9abeecfd91d9 - R 1125c8580bcae0bd5fcad566907cd268 -P b2b62546c4a5e9dccb8aa0cb8eda228d662c69159e320b01a377317bc909e89f -R 3699dfa06af6d8dfe43187d2c78cc578 -T *branch * idx-expr-fix -T *sym-idx-expr-fix * -T -sym-trunk * ++P 563ad3be60d22c45f1c5b9a3e67738593f8b38f137147c56514166fbabf95365 e908b26a990929996b3c16f0429e8313cd8fcefe7c883c77f66ea69f4059d6e2 ++R 9822cb01a0a25ade383ea6b744dcbd50 ++T +closed e908b26a990929996b3c16f0429e8313cd8fcefe7c883c77f66ea69f4059d6e2 U drh - Z b355d7c6c1259a41f882f80ab53c48da -Z 99b5085d0aa63df2f84ecba864ce3e16 ++Z 9cbc66987b5c47a4fc137a8fa57a64ca # Remove this line to create a well-formed Fossil manifest. diff --cc manifest.uuid index 74e16885c4,303299d818..f5689a65a6 --- a/manifest.uuid +++ b/manifest.uuid @@@ -1,1 -1,1 +1,1 @@@ - 563ad3be60d22c45f1c5b9a3e67738593f8b38f137147c56514166fbabf95365 -e908b26a990929996b3c16f0429e8313cd8fcefe7c883c77f66ea69f4059d6e2 ++a35d13db09e32ee339f3983fe36b073714753ee3d39f577ae8d20596d7adc3eb diff --cc src/sqliteInt.h index 35c4d403e6,20e23ed2bc..bb61cb6916 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@@ -2114,10 -2113,9 +2114,10 @@@ struct FuncDestructor #define MFUNCTION(zName, nArg, xPtr, xFunc) \ {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \ xPtr, 0, xFunc, 0, 0, 0, #zName, {0} } - #define JFUNCTION(zName, nArg, bUseCache, bRS, bWS, iArg, xFunc) \ -#define JFUNCTION(zName, nArg, bUseCache, bSubtype, iArg, xFunc) \ ++#define JFUNCTION(zName, nArg, bUseCache, bWS, bRS, iArg, xFunc) \ {nArg, SQLITE_FUNC_BUILTIN|SQLITE_DETERMINISTIC|SQLITE_FUNC_CONSTANT|\ - SQLITE_UTF8|((bUseCache)*SQLITE_FUNC_RUNONLY)|((bSubtype)*SQLITE_SUBTYPE), \ + SQLITE_UTF8|((bUseCache)*SQLITE_FUNC_RUNONLY)|\ + ((bRS)*SQLITE_SUBTYPE)|((bWS)*SQLITE_RESULT_SUBTYPE), \ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } #define INLINE_FUNC(zName, nArg, iArg, mFlags) \ {nArg, SQLITE_FUNC_BUILTIN|\ diff --cc src/where.c index 05ae24f7bc,cfee45f879..448fe27c11 --- a/src/where.c +++ b/src/where.c @@@ -5810,6 -5810,17 +5810,20 @@@ static SQLITE_NOINLINE void whereAddInd continue; } if( sqlite3ExprIsConstant(pExpr) ) continue; + if( pExpr->op==TK_FUNCTION ){ ++ /* Functions that might set a subtype should not be replaced by the ++ ** value taken from an expression index since the index omits the ++ ** subtype. https://sqlite.org/forum/forumpost/68d284c86b082c3e */ + int n; + FuncDef *pDef; + sqlite3 *db = pParse->db; + assert( ExprUseXList(pExpr) ); + n = pExpr->x.pList ? pExpr->x.pList->nExpr : 0; + pDef = sqlite3FindFunction(db, pExpr->u.zToken, n, ENC(db), 0); - if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_FUNC_SUBTYPE)!=0 ){ ++ if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_RESULT_SUBTYPE)!=0 ){ + continue; + } + } p = sqlite3DbMallocRaw(pParse->db, sizeof(IndexedExpr)); if( p==0 ) break; p->pIENext = pParse->pIdxEpr;