diff options
author | drh <> | 2025-07-08 19:53:36 +0000 |
---|---|---|
committer | drh <> | 2025-07-08 19:53:36 +0000 |
commit | 9a13a21223bdfc123dfd537c999822ff3077cfa8 (patch) | |
tree | 51b5ecfae9ceb57f879fb478574d5589765897be /src/btree.c | |
parent | 9b91aac83b3db7a108ed203ee43b40e2e735ac0e (diff) | |
parent | 449b34571e9022333eb0cd0ce403a4636719194d (diff) | |
download | sqlite-9a13a21223bdfc123dfd537c999822ff3077cfa8.tar.gz sqlite-9a13a21223bdfc123dfd537c999822ff3077cfa8.zip |
New optimizations to detect early when queries return no rows due to
tables being empty. This includes the EXISTS-to-JOIN optimization that
tries to transform EXISTS constraints into additional terms of the FROM
clause.
FossilOrigin-Name: e33da6d5dc964db817d1bc63c9083aecd93d49ee14d5198600b47eaf7c5b9331
Diffstat (limited to 'src/btree.c')
-rw-r--r-- | src/btree.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/btree.c b/src/btree.c index 00cdc9760..a931b0d12 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5667,6 +5667,30 @@ int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ return rc; } +/* Set *pRes to 1 (true) if the BTree pointed to by cursor pCur contains zero +** rows of content. Set *pRes to 0 (false) if the table contains content. +** Return SQLITE_OK on success or some error code (ex: SQLITE_NOMEM) if +** something goes wrong. +*/ +int sqlite3BtreeIsEmpty(BtCursor *pCur, int *pRes){ + int rc; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + if( pCur->eState==CURSOR_VALID ){ + *pRes = 0; + return SQLITE_OK; + } + rc = moveToRoot(pCur); + if( rc==SQLITE_EMPTY ){ + *pRes = 1; + rc = SQLITE_OK; + }else{ + *pRes = 0; + } + return rc; +} + #ifdef SQLITE_DEBUG /* The cursors is CURSOR_VALID and has BTCF_AtLast set. Verify that ** this flags are true for a consistent database. |