Hello, I was reading through sqlite source code for educational purposes. And encountered something that I didn't quite understood. Maybe code or comment is incorrect. To demonstrate what I think the problem is I created this bitbucket project <https://bitbucket.org/tibonarium/list_move_to_end/src/master/> In the file [build.c](https://github.com/sqlite/sqlite/blob/master/src/build.c) inside function `sqlite3CreateIndex` there is a comment "Ensure all REPLACE indexes are at the end of the list". But this implementation will not move all elements with property `onError=OE_Replace` to the end of the list. ```c if( pTab ){ /* Ensure all REPLACE indexes are at the end of the list */ Index **ppFrom = &pTab->pIndex; Index *pThis; for(ppFrom=&pTab->pIndex; (pThis = *ppFrom)!=0; ppFrom=&pThis->pNext){ Index *pNext; if( pThis->onError!=OE_Replace ) continue; while( (pNext = pThis->pNext)!=0 && pNext->onError!=OE_Replace ){ *ppFrom = pNext; pThis->pNext = pNext->pNext; pNext->pNext = pThis; ppFrom = &pNext->pNext; } break; } } ``` We can fix it this way ```c if( pTab ){ /* Ensure all REPLACE indexes are at the end of the list */ Index **ppFrom = &pTab->pIndex; Index *pThis; for(ppFrom=&pTab->pIndex; (pThis = *ppFrom)!=0; ppFrom=&pThis->pNext){ Index *pNext; Index *pTail = pThis; if( pThis->onError!=OE_Replace ) continue; while( (pNext = pThis->pNext)!=0 ){ if (pNext->onError!=OE_Replace) { *ppFrom = pNext; pThis->pNext = pNext->pNext; pNext->pNext = pTail; ppFrom = &pNext->pNext; } else { pThis = pNext; } } break; } } ```