]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Do not replace expressions that return subtypes with values taken from an
authordrh <>
Thu, 9 Nov 2023 12:17:57 +0000 (12:17 +0000)
committerdrh <>
Thu, 9 Nov 2023 12:17:57 +0000 (12:17 +0000)
index.

FossilOrigin-Name: a35d13db09e32ee339f3983fe36b073714753ee3d39f577ae8d20596d7adc3eb

1  2 
manifest
manifest.uuid
src/sqliteInt.h
src/where.c

diff --cc manifest
index f9b734176ed26f53b330f3f54a0fe68968ab72e0,6996862b817b3d2f9fa0b12f42359f18e7776c1c..50b7a2513dc8c5407d47743010e1a532ee06dbc5
+++ 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 74e16885c4c4a63d9a68d36d1b38b02dfeaa3e1e,303299d818fc2971d3212b826b6ce010dfad1389..f5689a65a642ed129da8dff02ca7254025401cfa
@@@ -1,1 -1,1 +1,1 @@@
- 563ad3be60d22c45f1c5b9a3e67738593f8b38f137147c56514166fbabf95365
 -e908b26a990929996b3c16f0429e8313cd8fcefe7c883c77f66ea69f4059d6e2
++a35d13db09e32ee339f3983fe36b073714753ee3d39f577ae8d20596d7adc3eb
diff --cc src/sqliteInt.h
index 35c4d403e6fdebc3856fa10427c4db6f7eb39ea7,20e23ed2bcaad199ea2f2096986590eca757c242..bb61cb6916afed6bd2054ad8a47dd0e1aee3b9d9
@@@ -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 05ae24f7bc4d5e9ad15be8067a40e5ebf296b39c,cfee45f87953c29d73ae9d3f53a11cc30b4d0a5e..448fe27c11d00cc7a9e243b9d7d9b89aee667d30
@@@ -5810,6 -5810,17 +5810,20 @@@ static SQLITE_NOINLINE void whereAddInd
        continue;
      }
      if( sqlite3ExprIsConstant(pExpr) ) continue;
 -      if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_FUNC_SUBTYPE)!=0 ){
+     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_RESULT_SUBTYPE)!=0 ){
+         continue;
+       }
+     }
      p = sqlite3DbMallocRaw(pParse->db,  sizeof(IndexedExpr));
      if( p==0 ) break;
      p->pIENext = pParse->pIdxEpr;