]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Avoid returning SQLITE_ERROR_RETRY if collation sequences associated with the table...
authordan <Dan Kennedy>
Wed, 20 Aug 2025 15:42:23 +0000 (15:42 +0000)
committerdan <Dan Kennedy>
Wed, 20 Aug 2025 15:42:23 +0000 (15:42 +0000)
FossilOrigin-Name: ac649e5b9ca9b8f7729defa8d646df8c0cb57977a5eedcfa2cf1147d109a17f1

manifest
manifest.uuid
src/build.c
src/main.c
test/without_rowid7.test

index 25cbad0cb997122460a662736198cf056d78a0ea..686b15d35d8674834f2e5c0e871fb3dabaec75b1 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sproblem\swith\sSQLITE_CHANGESET_CONFLICT\sconflicts\scaused\sby\sDELETE\striggers\swithin\sa\scall\sto\ssqlite3changset_apply_v2()\swith\sSQLITE_CHANGESETAPPLY_IGNORENOOP\sspecified.
-D 2025-08-20T11:21:35.942
+C Avoid\sreturning\sSQLITE_ERROR_RETRY\sif\scollation\ssequences\sassociated\swith\sthe\stable's\sPK\scannot\sbe\sfound\swhen\screating\san\sindex.\sPossible\sfix\sfor\s[forum:aa61ab56ad\s|\sforum\spost\saa61ab56ad].
+D 2025-08-20T15:42:23.331
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -685,7 +685,7 @@ F src/btmutex.c 30dada73a819a1ef5b7583786370dce1842e12e1ad941e4d05ac29695528daea
 F src/btree.c cb5b8ceb9baa02a63a2f83dec09c4153e1cfbdf9c2adef5c62c26d2160eeb067
 F src/btree.h e823c46d87f63d904d735a24b76146d19f51f04445ea561f71cc3382fd1307f0
 F src/btreeInt.h 9c0f9ea5c9b5f4dcaea18111d43efe95f2ac276cd86d770dce10fd99ccc93886
-F src/build.c 7cbb216c7ff51b321a9767d78d510d1ee5b82642aa3a29f59a3e5c415462eb77
+F src/build.c 213a9d24c931ef4694564894cda8dac8dbeb1519d428fd2d7ae622ac357c05a5
 F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/date.c 9db4d604e699a73e10b8e85a44db074a1f04c0591a77e2abfd77703f50dce1e9
@@ -705,7 +705,7 @@ F src/insert.c dfd311b0ac2d4f6359e62013db67799757f4d2cc56cca5c10f4888acfbbfa3fd
 F src/json.c cb87977b1ee25ee7d27505d65a9261b687395bf895342c8ba566b7c01aee2047
 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
 F src/loadext.c d7edd8e671237539d795d30daaf888908a2c82e99bade4c78f3be021e8b7d655
-F src/main.c eb46066bf2f0bec2dd89229572de5a9c479c47da134e2422e7a0056e9510cbee
+F src/main.c 458e79da86c957a094c1c256136af43e7dfec2c58475ee9cbbda4dc202005021
 F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
 F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
@@ -2070,7 +2070,7 @@ F test/without_rowid3.test 39ab0dd773eaa62e59b17093f875327630f54c4145458f6d2b053
 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a
 F test/without_rowid5.test f14298eb5ac8013894b75141c3f4f5f325a6ad0eded55516eef72c49e60a67cb
 F test/without_rowid6.test efbd7add62c59bf5ca97bf8da674e734e6a70ef979234e816166824b4d258f68
-F test/without_rowid7.test d7c59a93d726b55812d620f8f284e01904a5b85f9ee9eea8f2f68571a5e8c40e
+F test/without_rowid7.test 747d3fbef7108d416d6416694b03d8ff046dc9cc82b3d911715feb472444b95a
 F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66
 F test/writecrash.test 13520af28f376bfc8c0bcd130efc1fff20bb165198e8b94cf153f1f754154bb9
 F test/zeroblob.test 7b74cefc7b281dfa2b07cd237987fbe94b4a2037a7771e9e83f2d5f608b1d99e
@@ -2169,8 +2169,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 7d13e8e403ba00d37b950caa359d74452319247495284d252efa6473bad15b64
-R ae093d0946efac31f01b7b9bdaa4b770
+P 138e2aab43ac07aaf8c5389105ff6d3e107ff2d35badcb48233664fcb9661471
+R 9e5c7e81644c35679b2a0a46b53e72da
+T *branch * create-index-error-retry-fix
+T *sym-create-index-error-retry-fix *
+T -sym-trunk *
 U dan
-Z 7b86a84e6c2cd643602bc41c4f1ab398
+Z 19b61eb0eb1df6f2f14da4dd841ac729
 # Remove this line to create a well-formed Fossil manifest.
index 24d8076ed2f239a7c5be6e303c40728a97f4dc1c..c96ac75d65de433ffeb8dcb8fc9189570321c3da 100644 (file)
@@ -1 +1 @@
-138e2aab43ac07aaf8c5389105ff6d3e107ff2d35badcb48233664fcb9661471
+ac649e5b9ca9b8f7729defa8d646df8c0cb57977a5eedcfa2cf1147d109a17f1
index f811af35b9ec984318a48041e0d0086930286ea7..6b1d3993f0e2800857029ec1b1f2a625381ae119 100644 (file)
@@ -5663,14 +5663,19 @@ KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){
     }
     if( pParse->nErr ){
       assert( pParse->rc==SQLITE_ERROR_MISSING_COLLSEQ );
-      if( pIdx->bNoQuery==0 ){
+      if( pIdx->bNoQuery==0 
+       && sqlite3HashFind(&pIdx->pSchema->idxHash, pIdx->zName)
+      ){
         /* Deactivate the index because it contains an unknown collating
         ** sequence.  The only way to reactive the index is to reload the
         ** schema.  Adding the missing collating sequence later does not
         ** reactive the index.  The application had the chance to register
         ** the missing index using the collation-needed callback.  For
         ** simplicity, SQLite will not give the application a second chance.
-        */
+        **
+        ** Except, do not do this if the index is not in the schema hash
+        ** table. In this case the index is currently being constructed
+        ** by a CREATE INDEX statement, and retrying will not help.  */
         pIdx->bNoQuery = 1;
         pParse->rc = SQLITE_ERROR_RETRY;
       }
index 0dd9926fec46b85f5c61b0fb90f8469370465a1f..53b728f0236eb88e0c6ba0427de3a436b469cf4e 100644 (file)
@@ -1532,6 +1532,9 @@ const char *sqlite3ErrName(int rc){
       case SQLITE_OK:                 zName = "SQLITE_OK";                break;
       case SQLITE_ERROR:              zName = "SQLITE_ERROR";             break;
       case SQLITE_ERROR_SNAPSHOT:     zName = "SQLITE_ERROR_SNAPSHOT";    break;
+      case SQLITE_ERROR_RETRY:        zName = "SQLITE_ERROR_RETRY";       break;
+      case SQLITE_ERROR_MISSING_COLLSEQ:
+                                zName = "SQLITE_ERROR_MISSING_COLLSEQ";   break;
       case SQLITE_INTERNAL:           zName = "SQLITE_INTERNAL";          break;
       case SQLITE_PERM:               zName = "SQLITE_PERM";              break;
       case SQLITE_ABORT:              zName = "SQLITE_ABORT";             break;
index 56e9fb40b9811d8bc64e80ffb5f5badf48b1a189..bf0273d7051355e671ce39ff779f8f1028c78c13 100644 (file)
@@ -55,6 +55,69 @@ do_execsql_test 2.4 {
   PRAGMA index_info(t3);
 } {}
 
+#-------------------------------------------------------------------------
+reset_db
+db collate mysort mysort
+db collate mysort2 mysort
+proc mysort {a b} { string compare $a $b }
+do_execsql_test 3.0 {
+  CREATE TABLE t1(
+      a PRIMARY KEY COLLATE mysort, b COLLATE mysort2
+  ) WITHOUT ROWID;
+  INSERT INTO t1 VALUES(1, 2);
+}
+
+db close
+sqlite3 db test.db
+
+do_catchsql_test 3.1.1 {
+  SELECT * FROM t1 WHERE a=1;
+} {1 {no such collation sequence: mysort}}
+do_test 3.1.2 {
+  sqlite3_extended_errcode db
+} {SQLITE_ERROR_MISSING_COLLSEQ}
+
+db collate mysort mysort
+
+do_catchsql_test 3.2.1 {
+  CREATE UNIQUE INDEX i1 ON t1(b);
+} {1 {no such collation sequence: mysort2}}
+do_test 3.2.2 {
+  sqlite3_extended_errcode db
+} {SQLITE_ERROR_MISSING_COLLSEQ}
+
+db close
+sqlite3 db test.db
+
+do_catchsql_test 3.3.1 {
+  CREATE UNIQUE INDEX i1 ON t1(1);
+} {1 {no such collation sequence: mysort}}
+do_test 3.3.2 {
+  sqlite3_extended_errcode db
+} {SQLITE_ERROR_MISSING_COLLSEQ}
+
+do_test 3.4.1 {
+  list [catch {
+    sqlite3_prepare_v3 db "CREATE UNIQUE INDEX i1 ON t1(1)" -1 0
+  } msg] $msg
+} {1 {(1) no such collation sequence: mysort}}
+do_test 3.4.2 {
+  sqlite3_extended_errcode db
+} {SQLITE_ERROR_MISSING_COLLSEQ}
+
+sqlite3_extended_result_codes db 1
+
+do_test 3.5.1 {
+  list [catch {
+    sqlite3_prepare_v3 db "CREATE UNIQUE INDEX i1 ON t1(1)" -1 0
+  } msg] $msg
+} {1 {(257) no such collation sequence: mysort}}
+do_test 3.5.2 {
+  sqlite3_extended_errcode db
+} {SQLITE_ERROR_MISSING_COLLSEQ}
 
+do_catchsql_test 3.6 {
+  SELECT * FROM t1 WHERE a=1;
+} {1 {no such collation sequence: mysort}}
 
 finish_test