diff options
author | drh <> | 2025-04-15 21:59:38 +0000 |
---|---|---|
committer | drh <> | 2025-04-15 21:59:38 +0000 |
commit | 0243ca82459db9984f3708eb844b32bcebbff2e5 (patch) | |
tree | 86a361a59af7b29db2b4b7a3b870e99521e48b8b /src | |
parent | 8488789d742ba6cb818fab54d3c34e3d512413a0 (diff) | |
download | sqlite-0243ca82459db9984f3708eb844b32bcebbff2e5.tar.gz sqlite-0243ca82459db9984f3708eb844b32bcebbff2e5.zip |
Correctly handle the case of a multi-column UNIQUE constraint that contains
the ROWID as one of it columns, and then the columns of that UNIQUE are
used in a row-value IN operator as a WHERE clause constraint. Reported by
[forum:/forumpost/b9647a113b465950|forum post b9647a113b]. Problem
introduced by [723f1be3d4a905a6], part of ticket [da78413751863].
FossilOrigin-Name: d22475b81c4e26ccc50f3b5626d43b32f7a2de34e5a764539554665bdda735d5
Diffstat (limited to 'src')
-rw-r--r-- | src/build.c | 1 | ||||
-rw-r--r-- | src/sqliteInt.h | 1 | ||||
-rw-r--r-- | src/where.c | 2 |
3 files changed, 3 insertions, 1 deletions
diff --git a/src/build.c b/src/build.c index 9c0285e3d..13f5b7133 100644 --- a/src/build.c +++ b/src/build.c @@ -4219,6 +4219,7 @@ void sqlite3CreateIndex( assert( j<=0x7fff ); if( j<0 ){ j = pTab->iPKey; + pIndex->bIdxRowid = 1; }else{ if( pTab->aCol[j].notNull==0 ){ pIndex->uniqNotNull = 0; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 35e5b94d7..edf925964 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2792,6 +2792,7 @@ struct Index { unsigned bLowQual:1; /* sqlite_stat1 says this is a low-quality index */ unsigned bNoQuery:1; /* Do not use this index to optimize queries */ unsigned bAscKeyBug:1; /* True if the bba7b69f9849b5bf bug applies */ + unsigned bIdxRowid:1; /* One or more of the index keys is the ROWID */ unsigned bHasVCol:1; /* Index references one or more VIRTUAL columns */ unsigned bHasExpr:1; /* Index contains an expression, either a literal ** expression, or a reference to a VIRTUAL column */ diff --git a/src/where.c b/src/where.c index 3320f6855..c51d1ba81 100644 --- a/src/where.c +++ b/src/where.c @@ -3476,7 +3476,7 @@ static int whereLoopAddBtreeIndex( if( (pNew->wsFlags & WHERE_TOP_LIMIT)==0 && pNew->u.btree.nEq<pProbe->nColumn && (pNew->u.btree.nEq<pProbe->nKeyCol || - pProbe->idxType!=SQLITE_IDXTYPE_PRIMARYKEY) + (pProbe->idxType!=SQLITE_IDXTYPE_PRIMARYKEY && !pProbe->bIdxRowid)) ){ if( pNew->u.btree.nEq>3 ){ sqlite3ProgressCheck(pParse); |