mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-01 06:27:03 +03:00
Changes to the sesssions module ensure that tables appear within changesets and patchsets in the same order that they were attached to the sessions object.
FossilOrigin-Name: 7695890230dc1e0c6db9b7aa509db2039c7f7239
This commit is contained in:
@ -1188,7 +1188,7 @@ static int sessionFindTable(
|
||||
){
|
||||
rc = sqlite3session_attach(pSession, zName);
|
||||
if( rc==SQLITE_OK ){
|
||||
pRet = pSession->pTable;
|
||||
for(pRet=pSession->pTable; pRet->pNext; pRet=pRet->pNext);
|
||||
assert( 0==sqlite3_strnicmp(pRet->zName, zName, nName+1) );
|
||||
}
|
||||
}
|
||||
@ -1675,12 +1675,17 @@ int sqlite3session_attach(
|
||||
if( !pTab ){
|
||||
rc = SQLITE_NOMEM;
|
||||
}else{
|
||||
/* Populate the new SessionTable object and link it into the list. */
|
||||
/* Populate the new SessionTable object and link it into the list.
|
||||
** The new object must be linked onto the end of the list, not
|
||||
** simply added to the start of it in order to ensure that tables
|
||||
** appear in the correct order when a changeset or patchset is
|
||||
** eventually generated. */
|
||||
SessionTable **ppTab;
|
||||
memset(pTab, 0, sizeof(SessionTable));
|
||||
pTab->zName = (char *)&pTab[1];
|
||||
memcpy(pTab->zName, zName, nName+1);
|
||||
pTab->pNext = pSession->pTable;
|
||||
pSession->pTable = pTab;
|
||||
for(ppTab=&pSession->pTable; *ppTab; ppTab=&(*ppTab)->pNext);
|
||||
*ppTab = pTab;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4220,19 +4225,26 @@ static int sessionChangesetToHash(
|
||||
if( 0==sqlite3_strnicmp(pTab->zName, zNew, nNew+1) ) break;
|
||||
}
|
||||
if( !pTab ){
|
||||
SessionTable **ppTab;
|
||||
|
||||
pTab = sqlite3_malloc(sizeof(SessionTable) + nCol + nNew+1);
|
||||
if( !pTab ){
|
||||
rc = SQLITE_NOMEM;
|
||||
break;
|
||||
}
|
||||
memset(pTab, 0, sizeof(SessionTable));
|
||||
pTab->pNext = pGrp->pList;
|
||||
pTab->nCol = nCol;
|
||||
pTab->abPK = (u8*)&pTab[1];
|
||||
memcpy(pTab->abPK, abPK, nCol);
|
||||
pTab->zName = (char*)&pTab->abPK[nCol];
|
||||
memcpy(pTab->zName, zNew, nNew+1);
|
||||
pGrp->pList = pTab;
|
||||
|
||||
/* The new object must be linked on to the end of the list, not
|
||||
** simply added to the start of it. This is to ensure that the
|
||||
** tables within the output of sqlite3changegroup_output() are in
|
||||
** the right order. */
|
||||
for(ppTab=&pGrp->pList; *ppTab; ppTab=&(*ppTab)->pNext);
|
||||
*ppTab = pTab;
|
||||
}else if( pTab->nCol!=nCol || memcmp(pTab->abPK, abPK, nCol) ){
|
||||
rc = SQLITE_SCHEMA;
|
||||
break;
|
||||
|
Reference in New Issue
Block a user